package com.jyniubi.gmall.cart.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.Update;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.jyniubi.gmall.cart.entity.CartEntity;
import com.jyniubi.gmall.cart.mapper.CartMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

// 为什么这俩异步方法要重写一个类呢？
// 这俩方法要想实现异步注解，注解是基于CGLib代理（AOP）实现的，同一个类中的方法调用会绕过spring的代理，导致异步失效
//  AOP：Aspect Oriented Programming，面向切面编程，底层原理：动态代理
//	JDK代理：基于接口	InvocationHandler接口（invoke） Proxy.newProxyInstance()
//	CGLib代理：基于实现类 MethodInterceptor（intercept） Enhancer.create()
//	作用：抽取公共业务逻辑
@Service
public class CartAsyncService {
    @Autowired
    private CartMapper cartMapper;
    @Async
    public void updateCart(String userId, String skuId, CartEntity cart){
        //int i = 1/0;
        this.cartMapper.update(cart, new UpdateWrapper<CartEntity>().eq("user_id", userId)
                .eq("sku_id", skuId));
    }
    @Async
    public void insertCart(String userId,CartEntity cart){
        this.cartMapper.insert(cart);
    }

    @Async
    public void deleteCartByUserId(String userId) {
        this.cartMapper.delete(new UpdateWrapper<CartEntity>().eq("user_id",userId));
    }
    @Async
    public void deleteCartByUserIdAndSkuId(String userId, Long skuId) {
        this.cartMapper.delete(new UpdateWrapper<CartEntity>().eq("user_id",userId).eq("sku_id",skuId));
    }
}
